package file_utils

import (
	"embed"
	"fmt"
	"io"
	"io/fs"
	"os"
	"path/filepath"
)

// 文件路径
var FilePathList []string

// CopyEmbeddedFiles 复制嵌入的文件系统到目标目录
func CopyEmbeddedFiles(staticFiles embed.FS, srcDir, destDir string) error {

	// 获取嵌入文件系统的子目录
	subFs, err := fs.Sub(staticFiles, srcDir)
	if err != nil {
		return fmt.Errorf("获取子文件系统失败: %w", err)
	}

	// 遍历嵌入的文件系统
	err = fs.WalkDir(subFs, ".", func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}

		// 构建目标路径
		destPath := filepath.Join(destDir, path)

		// 如果是目录，则创建它
		if d.IsDir() {
			if err := os.MkdirAll(destPath, 0755); err != nil {
				return fmt.Errorf("创建目录失败: %w", err)
			}
			return nil
		}

		// 如果是文件，则复制它
		outFile, err := os.Create(destPath)
		if err != nil {
			return fmt.Errorf("创建目标文件失败: %w", err)
		}
		defer outFile.Close()

		file, err := staticFiles.Open(path)
		if err != nil {
			return fmt.Errorf("打开文件 %s 失败: %w", path, err)
		}

		//data, err := staticFiles.ReadFile(d.Name())
		//if err != nil {
		//	return fmt.Errorf("读取文件 %s 失败: %w", path, err)
		//}

		targetFullPath := filepath.Join(destDir, path)
		FilePathList = append(FilePathList, targetFullPath)

		// 将数据写入目标文件
		if _, err := io.Copy(outFile, file); err != nil {
			return fmt.Errorf("写入文件失败: %w", err)
		}

		return nil
	})

	return err
}
